Baggage (otel)
あんまりちゃんと呼んでないmrsekut.icon
GPT-4o.icon
簡単にいうと 「リクエストやトレースに紐づく追加情報を、サービス間やプロセス間で一緒に持ち運ぶための key-value ストア」 です。
Baggage の概要
Context が「実行スコープの状態全般」だとすると、Baggage は「サービスをまたいで持ち運びたい付加情報」。
用途:サービス間・プロセス間でデータを伝搬させる
例:clientId, userId, accountId, productId, originIP など
形式:シンプルな string → string のマップ
具体例
例えばこんなシナリオ:
1. API Gateway が clientId = "1234" を受け取る
2. そのリクエストは複数のサービスを経由し、DB クエリやログ出力も発生
3. Baggage を使えば、clientId を Context と一緒に自動的に全サービスに持ち回れる
4. 各サービスで新しく Span やログを作るときに、この clientId を付与できる
これにより、例えば:
「特定ユーザーが最も遅い DB クエリを実行しているか」をトレース分析で調べられる
ログに一貫して clientId を出せる
Baggage の注意点(セキュリティ)
HTTP ヘッダで送られる
自動計測(Instrumentation)では Baggage がほとんどのネットワークリクエストに含まれる
ネットワーク外の第三者や外部 API にも送られてしまう可能性あり
改ざん検知はない
Baggage の値が「正しい送信元から来たものか」は保証されない
信頼できる環境でのみ利用すべき
Baggage と Attributes の違い
Span、Metric、Log に直接つけるメタデータ
そのスコープ内でのみ有効
Baggage
サービス間で持ち回るデータ
Attributes に自動的には反映されない(明示的にBaggageから読み取って設定する必要がある)
一部言語には Baggage Span Processor があり、自動的にSpan作成時にBaggageをAttributesにコピーしてくれる
TypeScript でのサンプル
OpenTelemetry API を使って Baggage を設定・取得する例です。
code:ts
import { propagation, context, baggage } from '@opentelemetry/api';
// Baggage を作成
const myBaggage = baggage.createBaggage({
clientId: { value: '1234' },
tenantId: { value: 'abcd' }
});
// Context に Baggage を紐づけ
const ctxWithBaggage = propagation.setBaggage(context.active(), myBaggage);
// Baggage の取得
const extractedBaggage = propagation.getBaggage(ctxWithBaggage);
if (extractedBaggage) {
console.log(extractedBaggage.getEntry('clientId')?.value); // "1234"
}
// 別の場所(別サービスや非同期処理)で使う
context.with(ctxWithBaggage, () => {
const currentBaggage = propagation.getBaggage(context.active());
console.log(currentBaggage?.getEntry('tenantId')?.value); // "abcd"
});
まとめ
Baggage = リクエストスコープの key-value をサービス間で持ち回る仕組み
利用するとログ・メトリクス・トレース分析の相関が容易に
ただし 自動で外部に送信されることがある ので情報は慎重に選ぶ
Attributesとは別物で、必要に応じてコピーして使う